home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / rpg / crossfir.92 / crossfir / crossfire-0.92.5 / server / c_bind.c < prev    next >
C/C++ Source or Header  |  1996-07-24  |  8KB  |  312 lines

  1. /*
  2.  * Bind command
  3.  *    ++Jam
  4.  */
  5.  
  6. #include <global.h>
  7. #include <sproto.h>
  8.  
  9. int command_bind (object *op, char *params)
  10. {
  11.   static char buf[MAX_BUF];
  12.   int flags;
  13.  
  14.   if (!params) {
  15.     new_draw_info(NDI_UNIQUE, 0,op, "Usage: bind [-nfrge] {<commandline>/commandkey/firekey{1/2}/runkey{1/2}}");
  16.     return 0;
  17.   }
  18.  
  19.   if (!strcmp(params, "commandkey")) {
  20.     op->contr->write_buf[0] ='C';
  21.     new_draw_info(NDI_UNIQUE, 0,op, "Push key to bind new commandkey.");
  22.     op->contr->state = ST_CONFIGURE;
  23.     return 1;
  24.   }
  25.   if (!strcmp(params, "firekey1")) {
  26.     op->contr->write_buf[0] ='F';
  27.     new_draw_info(NDI_UNIQUE, 0,op, "Push key to bind new firekey 1.");
  28.     op->contr->state = ST_CONFIGURE;
  29.     return 1;
  30.   }
  31.   if (!strcmp(params, "firekey2")) {
  32.     op->contr->write_buf[0] ='f';
  33.     new_draw_info(NDI_UNIQUE, 0,op, "Push key to bind new firekey 2.");
  34.     op->contr->state = ST_CONFIGURE;
  35.     return 1;
  36.   }
  37.   if (!strcmp(params, "runkey1")) {
  38.     op->contr->write_buf[0] ='R';
  39.     new_draw_info(NDI_UNIQUE, 0,op, "Push key to bind new runkey 1.");
  40.     op->contr->state = ST_CONFIGURE;
  41.     return 1;
  42.   }
  43.   if (!strcmp(params, "runkey2")) {
  44.     op->contr->write_buf[0] ='r';
  45.     new_draw_info(NDI_UNIQUE, 0,op, "Push key to bind new runkey 2.");
  46.     op->contr->state = ST_CONFIGURE;
  47.     return 1;
  48.   }
  49.  
  50.   if (params[0] != '-')
  51.     flags =(KEYF_NORMAL|KEYF_FIRE|KEYF_RUN);
  52.   else {
  53.     flags =0;
  54.     for (params++; *params != ' '; params++)
  55.       switch (*params) {
  56.       case 'n':
  57.     flags |= KEYF_NORMAL;
  58.     break;
  59.       case 'f':
  60.     flags |= KEYF_FIRE;
  61.     break;
  62.       case 'r':
  63.     flags |= KEYF_RUN;
  64.     break;
  65.       case 'e':
  66.     flags |= KEYF_EDIT;
  67.     break;
  68.       case 'g':
  69.     flags |= 0x1000;
  70.     break;
  71.       case '\0':
  72.     new_draw_info(NDI_UNIQUE, 0,op, "Try unbind to remove bindings..");
  73.     return 0;
  74.       default:
  75.     new_draw_info_format(NDI_UNIQUE, 0,op,"Unknown flag to bind: '%c'", *params);
  76.     return 0;
  77.       }
  78.     params++;
  79.   }
  80.   
  81.   if (!(flags & (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN)))
  82.     flags |= (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN);
  83.  
  84.   if (!params[0]) {
  85.     new_draw_info(NDI_UNIQUE, 0,op, "Try unbind to remove bindings..");
  86.     return 0;
  87.   }
  88.  
  89.   new_draw_info_format(NDI_UNIQUE, 0, op,
  90.      "Push key to bind '%s'.", params);
  91.   sprintf(buf, "%i %s", flags, params);
  92.   sprintf(op->contr->write_buf, "B%s", buf);
  93.   op->contr->state = ST_CONFIGURE;
  94.   return 1;
  95. }
  96.  
  97.  
  98. extern char *find_func_name(CommFunc func);
  99.  
  100. void show_keys(object *op, int mode)
  101. {
  102.   int i, bi, count=1;
  103.   Key_s *key;
  104.   char buf[MAX_BUF], buff[4];
  105.  
  106.   new_draw_info_format(NDI_UNIQUE, 0, op,
  107.     "Commandkey %s (%d)", XKeysymToString(op->contr->commandkeysym),
  108.       op->contr->commandkey);
  109.  
  110.   new_draw_info_format(NDI_UNIQUE, 0, op,
  111.     "Firekeys 1: %s (%d), 2: %s (%d)",
  112.       XKeysymToString(op->contr->firekeysym[0]), op->contr->firekey[0],
  113.       XKeysymToString(op->contr->firekeysym[1]), op->contr->firekey[1]);
  114.  
  115.   new_draw_info_format(NDI_UNIQUE, 0, op,
  116.     "Runkeys 1: %s (%d), 2: %s (%d)",
  117.       XKeysymToString(op->contr->runkeysym[0]), op->contr->runkey[0],
  118.       XKeysymToString(op->contr->runkeysym[1]), op->contr->runkey[1]);
  119.  
  120.   for (i=0; i<COMMAND_HASH_SIZE; i++)
  121.     for (key=op->contr->keys[i]; key; key =key->next) {
  122.       if ((!!mode) == (!(key->flags & KEYF_DEFAULT))) 
  123.     break;
  124.       buff[0] ='\0';
  125.       buff[1] ='\0';
  126.       buff[2] ='\0';
  127.       buff[3] ='\0';
  128.       bi =0;
  129.       if (key->flags & KEYF_DEFAULT)
  130.     buff[bi++] ='d';
  131.       if (key->flags & KEYF_WIZ)
  132.     buff[bi++] ='w';
  133.       if ((key->flags & (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN)) ==
  134.       (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN))
  135.     buff[bi++] ='A';
  136.       else {
  137.     if (key->flags & KEYF_NORMAL)
  138.       buff[bi++] ='N';
  139.     if (key->flags & KEYF_FIRE)
  140.       buff[bi++] ='F';
  141.     if (key->flags & KEYF_RUN)
  142.       buff[bi++] ='R';
  143.       }
  144.       if (key->flags & KEYF_EDIT)
  145.     buff[bi++] ='E';
  146.  
  147.       if(key->keysym == NoSymbol) {
  148.     if (key->func)
  149.       if (key->params)
  150.         sprintf(buf, "%3d key (null) (%i) %s %s %s", count, 
  151.             (int)key->keycode,buff, find_func_name(key->func), key->params);
  152.       else
  153.         sprintf(buf, "%3d key (null) (%i) %s %s", count, 
  154.             (int)key->keycode, buff, find_func_name(key->func));
  155.     else
  156.       if (key->params)
  157.         sprintf(buf, "%3d key (null) (%i) %s %s", count, 
  158.             (int)key->keycode, buff, key->params);
  159.       else
  160.         sprintf(buf, "%3d key (null) (%i) %s", count, 
  161.             (int)key->keycode, buff);
  162.       } else {
  163.     if (key->func)
  164.       if (key->params)
  165.         sprintf(buf, "%3d key %s (%i) %s %s %s", count, 
  166.             XKeysymToString(key->keysym), (int)key->keycode,
  167.             buff, find_func_name(key->func), key->params);
  168.       else
  169.         sprintf(buf, "%3d key %s (%i) %s %s", count, 
  170.             XKeysymToString(key->keysym), (int)key->keycode,
  171.             buff, find_func_name(key->func));
  172.     else
  173.       if (key->params)
  174.         sprintf(buf, "%3d key %s (%i) %s %s", count, 
  175.             XKeysymToString(key->keysym), (int)key->keycode,
  176.             buff, key->params);
  177.       else
  178.         sprintf(buf, "%3d key %s (%i) %s (null)", count, 
  179.             XKeysymToString(key->keysym), (int)key->keycode, buff);
  180.       }
  181.       
  182.       new_draw_info(NDI_UNIQUE, 0,op, buf);
  183.       count++;
  184.     }                /* for */
  185. }
  186.  
  187. int command_unbind (object *op, char *params)
  188. {
  189.   int i, j, bi, mode=0, count=0;
  190.   Key_s *key, *tmp;
  191.   char buf[MAX_BUF], buff[4];
  192.  
  193.   if (!params || !params[0]) {
  194.     show_keys(op, 0);
  195.     return 0;
  196.   }
  197.  
  198.   if (!strcmp(params, "all") || !strcmp(params, "reset")) {
  199.     load_default_keys(op->contr);
  200.     new_draw_info(NDI_UNIQUE, 0,op, "Resetting to default bindings.");
  201.     return 0;
  202.   }
  203.  
  204.   if (params[0] == '-' && params[1] == 'g') {
  205.  
  206.     if (sscanf(params+2, "%d", &j)!=1) {
  207.       show_keys(op, 1);
  208.       return 0;
  209.     }
  210.     mode =1;
  211.   } else if (sscanf(params, "%d", &j)!=1) {
  212.     new_draw_info(NDI_UNIQUE, 0,op, "Usage: unbind [-g] [#]");
  213.     return 0;
  214.   }
  215.  
  216.   for (i=0; i<COMMAND_HASH_SIZE; i++)
  217.     for (key=op->contr->keys[i]; key; key =key->next) {
  218.       if ((!!mode) == (!(key->flags & KEYF_DEFAULT)))
  219.     break;
  220.       count++;
  221.       if (j != count)
  222.     continue;
  223.       if (key->flags & KEYF_DEFAULT) {
  224.     insert_key_complex(op->contr, key->keysym, key->keycode,
  225.        (key->flags&(KEYF_NORMAL|KEYF_FIRE|KEYF_RUN))|KEYF_USER, NULL);
  226.     goto unbinded;
  227.       }
  228.       if (key == op->contr->keys[i]) {
  229.     op->contr->keys[i] =key->next;
  230.     goto unbinded;
  231.       }
  232.       for (tmp=op->contr->keys[i]; tmp->next; tmp=tmp->next)
  233.     if (tmp->next == key) {
  234.       tmp->next =key->next;
  235.       goto unbinded;
  236.     }
  237.     }                /* for */
  238.  
  239.   new_draw_info(NDI_UNIQUE, 0,op, "No such entry. Try plain 'unbind' to find entry.");
  240.   return 0;
  241.  
  242.   /*
  243.    * Found. Now remove it.
  244.    */
  245.  unbinded:
  246.   
  247.   buff[0] ='\0';
  248.   buff[1] ='\0';
  249.   buff[2] ='\0';
  250.   buff[3] ='\0';
  251.   bi =0;
  252.   if (key->flags & KEYF_DEFAULT)
  253.     buff[bi++] ='d';
  254.   if (key->flags & KEYF_WIZ)
  255.     buff[bi++] ='w';
  256.   if ((key->flags & (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN)) ==
  257.       (KEYF_NORMAL|KEYF_FIRE|KEYF_RUN))
  258.     buff[bi++] ='A';
  259.   else {
  260.     if (key->flags & KEYF_NORMAL)
  261.       buff[bi++] ='N';
  262.     if (key->flags & KEYF_FIRE)
  263.       buff[bi++] ='F';
  264.     if (key->flags & KEYF_RUN)
  265.       buff[bi++] ='R';
  266.   }
  267.   if (key->flags & KEYF_EDIT)
  268.     buff[bi++] ='E';
  269.   
  270.   if(key->keysym == NoSymbol) {
  271.     if (key->func)
  272.       if (key->params)
  273.     sprintf(buf, "%3d key (null) (%i) %s %s %s", count, 
  274.         (int)key->keycode,buff, find_func_name(key->func), key->params);
  275.       else
  276.         sprintf(buf, "%3d key (null) (%i) %s %s", count, 
  277.             (int)key->keycode, buff, find_func_name(key->func));
  278.     else
  279.       if (key->params)
  280.     sprintf(buf, "%3d key (null) (%i) %s %s", count, 
  281.         (int)key->keycode, buff, key->params);
  282.       else
  283.     sprintf(buf, "%3d key (null) (%i) %s", count, 
  284.         (int)key->keycode, buff);
  285.   } else {
  286.     if (key->func)
  287.       if (key->params)
  288.     sprintf(buf, "%3d key %s (%i) %s %s %s", count, 
  289.         XKeysymToString(key->keysym), (int)key->keycode,
  290.         buff, find_func_name(key->func), key->params);
  291.       else
  292.     sprintf(buf, "%3d key %s (%i) %s %s", count, 
  293.         XKeysymToString(key->keysym), (int)key->keycode,
  294.         buff, find_func_name(key->func));
  295.     else
  296.       if (key->params)
  297.     sprintf(buf, "%3d key %s (%i) %s %s", count, 
  298.         XKeysymToString(key->keysym), (int)key->keycode,
  299.         buff, key->params);
  300.       else
  301.     sprintf(buf, "%3d key %s (%i) %s (null)", count, 
  302.         XKeysymToString(key->keysym), (int)key->keycode, buff);
  303.   }
  304.   new_draw_info(NDI_UNIQUE, 0,op, buf);
  305.   if (!(key->flags & KEYF_DEFAULT)) {
  306.     if (key->params)
  307.       free(key->params);
  308.     free(key);
  309.   }
  310.   return 0;
  311. }
  312.